Data Mapping এবং Schema Design হলো Elasticsearch-এ ডেটা সংরক্ষণ এবং সার্চ অপারেশন কার্যকরীভাবে পরিচালনার জন্য অত্যন্ত গুরুত্বপূর্ণ দুটি ধারণা। Mapping নির্ধারণ করে ডকুমেন্টের ফিল্ডগুলো কী ধরনের ডেটা ধারণ করবে, এবং Schema Design নির্ধারণ করে কিভাবে ডেটার স্ট্রাকচার তৈরি করা হবে যাতে সার্চ এবং অ্যানালাইসিস অপারেশন দ্রুত এবং কার্যকরী হয়। নিচে Data Mapping এবং Schema Design-এর বিস্তারিত আলোচনা করা হলো।
Data Mapping
Elasticsearch-এ Mapping হলো একটি প্রক্রিয়া, যা ডকুমেন্টের প্রতিটি ফিল্ডের ডেটা টাইপ এবং বৈশিষ্ট্য নির্ধারণ করে। এটি Schema Design-এর একটি অংশ হিসেবে কাজ করে এবং Elasticsearch-কে সঠিকভাবে ডেটা ইন্ডেক্স এবং সার্চ করতে সহায়ক করে। Mapping সাধারণত ইন্ডেক্স তৈরির সময় নির্ধারণ করা হয়, তবে পরে কাস্টমাইজও করা যায়।
Mapping-এর মূল উপাদানসমূহ
- Field Types (ফিল্ড টাইপ):
- প্রতিটি ফিল্ডে ডেটার ধরন নির্ধারণ করা হয়। যেমন:
- text: ফ্রি-টেক্সট ডেটা সংরক্ষণের জন্য ব্যবহৃত হয় (যেমন ডকুমেন্টের বিবরণ)।
- keyword: সুনির্দিষ্ট ডেটা বা কিওয়ার্ড সংরক্ষণের জন্য, যা ইন্ডেক্স এবং সার্চ করা যায় (যেমন স্ট্যাটাস বা ইমেইল)।
- integer, float: সংখ্যামূলক ডেটার জন্য।
- date: তারিখ সংরক্ষণের জন্য।
- boolean: True/False মানের জন্য।
- geo_point: ভৌগোলিক পয়েন্ট (ল্যাটিটিউড এবং লংগিটিউড) সংরক্ষণের জন্য।
- প্রতিটি ফিল্ডে ডেটার ধরন নির্ধারণ করা হয়। যেমন:
- Field Attributes (ফিল্ডের বৈশিষ্ট্য):
- প্রতিটি ফিল্ডে কিছু অতিরিক্ত বৈশিষ্ট্য নির্ধারণ করা যায়, যেমন:
- index: ডিফল্টভাবে
trueথাকে, যা ফিল্ডটিকে ইন্ডেক্স করতে সহায়ক করে। এটিfalseকরলে ফিল্ডটি ইন্ডেক্স করা হবে না। - analyzer:
textফিল্ডে টোকেনাইজেশন এবং এনালাইসিসের জন্য নির্দিষ্ট অ্যানালাইজার ব্যবহার করা যায়। - format:
dateফিল্ডের ফরম্যাট নির্ধারণ করতে ব্যবহৃত হয়।
- index: ডিফল্টভাবে
- প্রতিটি ফিল্ডে কিছু অতিরিক্ত বৈশিষ্ট্য নির্ধারণ করা যায়, যেমন:
Mapping তৈরি করার উদাহরণ
PUT /my-index
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"occupation": { "type": "keyword" },
"join_date": { "type": "date", "format": "yyyy-MM-dd" },
"location": { "type": "geo_point" }
}
}
}
- এখানে:
"name"ফিল্ডটিtextটাইপ হিসেবে নির্ধারণ করা হয়েছে, যা টেক্সট এনালাইসিসের জন্য ব্যবহৃত হবে।"age"ফিল্ডটি একটিintegerহিসেবে সংরক্ষিত হবে।"occupation"ফিল্ডটিkeywordটাইপ, যা সুনির্দিষ্ট মান সংরক্ষণ এবং ইন্ডেক্স করতে ব্যবহৃত হবে।"join_date"ফিল্ডেdateটাইপ নির্ধারণ করা হয়েছে এবং ফরম্যাট"yyyy-MM-dd"উল্লেখ করা হয়েছে।"location"ফিল্ডেgeo_pointটাইপ নির্ধারণ করা হয়েছে, যা ভৌগোলিক পয়েন্ট সংরক্ষণের জন্য ব্যবহৃত হবে।
Schema Design
Elasticsearch-এ Schema Design মূলত Data Mapping-এর মাধ্যমে ডেটার স্ট্রাকচার নির্ধারণ করে এবং এটি সার্চ অপারেশনের গতি ও কার্যকারিতা বাড়াতে সহায়ক হয়। Schema Design ভালোভাবে করা না হলে, সার্চ এবং ইন্ডেক্সিং ধীরগতির হতে পারে এবং রিসোর্স বেশি খরচ হতে পারে।
Schema Design-এর প্রধান নীতিমালা
ফিল্ড টাইপ সঠিকভাবে নির্ধারণ করা:
- প্রতিটি ফিল্ডে সঠিক ডেটা টাইপ ব্যবহার করা জরুরি। যেমন সংখ্যামূলক ডেটার জন্য
integerবাfloat, এবং সুনির্দিষ্ট কিওয়ার্ডের জন্যkeywordব্যবহার করা।
Text এবং Keyword ফিল্ডের পার্থক্য বোঝা:
- text ফিল্ড টোকেনাইজড এবং অ্যানালাইসড হয়, যা ফ্রি-টেক্সট সার্চের জন্য উপযোগী। এটি বড় টেক্সট বা বিবরণ সংরক্ষণের জন্য ব্যবহৃত হয়।
- keyword ফিল্ড একটি সুনির্দিষ্ট কিওয়ার্ড বা টার্ম সংরক্ষণ করে, যা ফিল্টার বা এক্সাক্ট ম্যাচ সার্চের জন্য ব্যবহৃত হয়।
Indexing অপ্টিমাইজ করা:
- যে ফিল্ডগুলোর প্রয়োজন নেই সেগুলো ইন্ডেক্স করা থেকে বিরত থাকা উচিত। এতে ইন্ডেক্স সাইজ এবং সার্চ পারফরম্যান্স উন্নত হয়।
- উদাহরণস্বরূপ, যদি কোনো ফিল্ড শুধুমাত্র ডেটা স্টোরেজের জন্য ব্যবহৃত হয়, তাহলে
"index": falseসেট করা যায়।
অন্যান্য বৈশিষ্ট্য ব্যবহার করা:
- Analyzers:
textফিল্ডে অ্যানালাইজার ব্যবহার করে কাস্টম সার্চ অপারেশন তৈরি করা যায়। - Date Format: তারিখের ফিল্ডে ফরম্যাট নির্ধারণ করা গেলে এটি সঠিকভাবে ইন্ডেক্স এবং রিট্রিভ করা যায়।
- Geo Mapping: ভৌগোলিক ডেটা সংরক্ষণ এবং সার্চ করার জন্য
geo_pointবাgeo_shapeটাইপ ব্যবহার করা যেতে পারে।
Schema Design-এর উদাহরণ
PUT /employee-index
{
"mappings": {
"properties": {
"employee_id": { "type": "keyword" },
"full_name": { "type": "text", "analyzer": "standard" },
"salary": { "type": "float" },
"is_active": { "type": "boolean" },
"hire_date": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}
- এখানে:
"employee_id"একটিkeywordফিল্ড, যা ইউনিকভাবে প্রতিটি এমপ্লয়িকে চিহ্নিত করবে।"full_name"একটিtextফিল্ড এবংstandardঅ্যানালাইজার ব্যবহার করা হয়েছে।"salary"একটিfloatটাইপ, যা এমপ্লয়ির বেতন সংরক্ষণ করবে।"is_active"একটিbooleanফিল্ড, যা কর্মচারীর সক্রিয় বা নিষ্ক্রিয় অবস্থা চিহ্নিত করবে।"hire_date"একটিdateফিল্ড, যেখানে"yyyy-MM-dd"ফরম্যাটে তারিখ সংরক্ষণ করা হবে।
Dynamic vs. Static Mapping
- Dynamic Mapping: ডিফল্টভাবে Elasticsearch ডাইনামিক মডেলে কাজ করে, অর্থাৎ নতুন ডকুমেন্ট এলে সেটির নতুন ফিল্ডগুলো ইন্ডেক্স করা হয় এবং ডেটা টাইপ সনাক্ত করা হয়।
- Static Mapping: কিছু ক্ষেত্রে, ফিক্সড স্কিমা ব্যবহার করা ভালো। আগে থেকেই ফিল্ডের ডেটা টাইপ এবং কাঠামো নির্ধারণ করা হয়, যাতে সার্চ অপারেশন দ্রুত হয় এবং ইন্ডেক্স সাইজ ছোট থাকে।
Dynamic Mapping নিষ্ক্রিয় করার উদাহরণ
PUT /fixed-index
{
"mappings": {
"dynamic": "strict",
"properties": {
"product_id": { "type": "keyword" },
"product_name": { "type": "text" }
}
}
}
- এখানে
"dynamic": "strict"ব্যবহার করে নতুন ফিল্ড অ্যালাউ করা বন্ধ করা হয়েছে। কেবলমাত্র আগে থেকে নির্ধারিত ফিল্ডগুলো ইন্ডেক্স করা হবে।
Schema Design-এর বেস্ট প্র্যাকটিস
- ফিল্ড সংরক্ষণ এবং ইন্ডেক্সের মধ্যে পার্থক্য রাখা: শুধুমাত্র সেই ফিল্ডগুলো ইন্ডেক্স করুন যেগুলো সার্চে প্রয়োজন।
- কমপ্লেক্স ডেটা টাইপ (nested, geo_shape) সঠিকভাবে ব্যবহার করা: সঠিক ব্যবহার ডেটার কাঠামো সহজ করে এবং সার্চ অপারেশনকে আরও দ্রুত করে।
- ডেটা এবং ফিল্ড সাইজ অপ্টিমাইজ করা: বড় টেক্সট বা বড় আকারের ডকুমেন্টগুলো ইন্ডেক্স করার সময় সতর্কতা অবলম্বন করা উচিত।
উপসংহার
Elasticsearch-এ Data Mapping এবং Schema Design ডেটা সংরক্ষণ এবং সার্চ অপারেশনের জন্য অপরিহার্য
Mapping হলো Elasticsearch-এ ডকুমেন্টের প্রতিটি ফিল্ডের ডেটা টাইপ এবং গঠন নির্ধারণ করার একটি প্রক্রিয়া। এটি Elasticsearch-কে সঠিকভাবে ডেটা ইন্ডেক্স এবং সার্চ করতে সহায়তা করে। Mapping মূলত একটি স্কিমা (schema) হিসেবে কাজ করে, যা নির্ধারণ করে ডকুমেন্টের বিভিন্ন ফিল্ড কী ধরনের ডেটা ধারণ করবে, যেমন টেক্সট, সংখ্যা, তারিখ, বা ভৌগোলিক পয়েন্ট। Mapping ছাড়া Elasticsearch ডেটাকে ঠিকভাবে ইন্ডেক্স বা রিট্রিভ করতে পারবে না।
Mapping-এর ভূমিকা
Mapping Elasticsearch-এ ডেটা ইন্ডেক্সিং এবং সার্চ অপারেশন কার্যকরী করতে সহায়ক। এর কিছু প্রধান ভূমিকা নিচে উল্লেখ করা হলো:
১. ডকুমেন্টের স্ট্রাকচার নির্ধারণ করা
- Mapping নির্ধারণ করে ডকুমেন্টের প্রতিটি ফিল্ডের ডেটা টাইপ (যেমন text, keyword, integer, date) এবং গঠন।
- এটি Elasticsearch-কে ডেটা সঠিকভাবে সংরক্ষণ এবং রিট্রিভ করতে সহায়ক করে।
উদাহরণ:
{
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"join_date": { "type": "date", "format": "yyyy-MM-dd" },
"is_active": { "type": "boolean" }
}
}
- এখানে
"name"ফিল্ডtext,"age"ফিল্ডinteger,"join_date"ফিল্ডdate, এবং"is_active"ফিল্ডbooleanটাইপ হিসেবে নির্ধারিত হয়েছে।
২. ডেটা টাইপের ভিত্তিতে সার্চ অপারেশন পরিচালনা করা
- Mapping Elasticsearch-কে সঠিক সার্চ অপারেশন পরিচালনা করতে সাহায্য করে।
- উদাহরণস্বরূপ,
textটাইপের ফিল্ডে ফ্রি-টেক্সট সার্চ করা হয়, যেখানেkeywordটাইপের ফিল্ডে এক্সাক্ট ম্যাচ সার্চ করা হয়।
উদাহরণ:
- text: টোকেনাইজ করা হয় এবং এনালাইসিস করা হয়, যেমন টেক্সট সার্চের জন্য।
- keyword: এক্সাক্ট ম্যাচ সার্চ, যেমন নির্দিষ্ট টার্ম বা কিওয়ার্ড ফিল্টার করতে।
৩. ফিল্ড এনালাইসিস কনফিগার করা
- Mapping-এর মাধ্যমে আপনি নির্দিষ্ট ফিল্ডের জন্য কাস্টম অ্যানালাইজার নির্ধারণ করতে পারেন। এটি টেক্সট এনালাইসিসের জন্য অত্যন্ত গুরুত্বপূর্ণ।
- বিভিন্ন অ্যানালাইজার (যেমন স্ট্যান্ডার্ড, ইংলিশ, লোয়ারকেস) ব্যবহার করে টেক্সট ডেটা কিভাবে টোকেনাইজ এবং ইন্ডেক্স হবে তা নির্ধারণ করা যায়।
উদাহরণ:
{
"properties": {
"content": {
"type": "text",
"analyzer": "english"
}
}
}
- এখানে
"content"ফিল্ডে"english"অ্যানালাইজার ব্যবহার করা হয়েছে, যা ইংরেজি ভাষার টেক্সট এনালাইসিসের জন্য উপযোগী।
৪. ইন্ডেক্স এবং সার্চ পারফরম্যান্স উন্নত করা
- Mapping Elasticsearch-কে ইন্ডেক্স করার সময় ফিল্ড এবং ডেটার ধরন সঠিকভাবে সংজ্ঞায়িত করতে সাহায্য করে, যা সার্চ অপারেশনকে দ্রুত করে তোলে।
- উদাহরণস্বরূপ, সংখ্যামূলক (numeric) বা তারিখের ফিল্ডে রেঞ্জ সার্চ দ্রুততর হয় যখন Mapping সঠিকভাবে কনফিগার করা থাকে।
৫. ফিল্ড কাস্টমাইজেশন এবং কন্ট্রোল
- Mapping-এর মাধ্যমে আপনি ফিল্ড কাস্টমাইজ করতে পারেন, যেমন:
- ফিল্ড ইন্ডেক্স করা হবে কিনা (index: true/false)।
- ফিল্ডের জন্য নরমালাইজার বা অ্যানালাইজার ব্যবহার করা হবে কিনা।
- ডেটার ফরম্যাট কী হবে (যেমন তারিখ ফিল্ডে
yyyy-MM-ddফরম্যাট)।
৬. কমপ্লেক্স ডেটা স্ট্রাকচার সংজ্ঞায়িত করা (Nested এবং Geo Data)
- Mapping এর মাধ্যমে Nested ডকুমেন্ট বা ভৌগোলিক (geo_point, geo_shape) ডেটার জন্য কনফিগারেশন নির্ধারণ করা যায়। এটি ডেটার স্ট্রাকচার এবং সার্চ অপারেশন আরও কার্যকর করে তোলে।
উদাহরণ:
{
"properties": {
"location": {
"type": "geo_point"
}
}
}
- এখানে
"location"ফিল্ডটি একটি ভৌগোলিক পয়েন্ট (latitude এবং longitude) ধারণ করবে।
Mapping-এর প্রকারভেদ
Dynamic Mapping:
- ডিফল্টভাবে Elasticsearch Dynamic Mapping ব্যবহার করে, যেখানে নতুন ডকুমেন্ট এলে Elasticsearch স্বয়ংক্রিয়ভাবে নতুন ফিল্ড এবং ডেটা টাইপ নির্ধারণ করে।
- এটি নতুন ডেটা দ্রুত ইন্ডেক্স করার জন্য উপযোগী, তবে এটি সবসময় নির্ভুল নাও হতে পারে।
Explicit (Static) Mapping:
- স্ট্যাটিক Mapping-এ, ডেভেলপার বা ব্যবহারকারী আগে থেকেই ডকুমেন্টের প্রতিটি ফিল্ড এবং তার ডেটা টাইপ নির্ধারণ করে।
- এটি ডেটা ইন্ডেক্সিং এবং সার্চের নির্ভুলতা বাড়ায় এবং পারফরম্যান্স উন্নত করে।
- এখানে প্রতিটি ফিল্ডের ডেটা টাইপ নির্দিষ্ট করা হয়েছে, যা ইন্ডেক্সিং এবং সার্চ অপারেশনে কার্যকরভাবে সাহায্য করবে।
Mapping-এর সেরা চর্চা (Best Practices)
সঠিক ফিল্ড টাইপ নির্ধারণ করা:
- প্রতিটি ফিল্ডের জন্য সঠিক ডেটা টাইপ নির্বাচন করা উচিত, যেমন
integerবাfloatসংখ্যা সংরক্ষণের জন্য এবংkeywordব্যবহার করা উচিত এক্সাক্ট ম্যাচের জন্য।
প্রয়োজন অনুযায়ী অ্যানালাইজার ব্যবহার করা:
- টেক্সট ফিল্ডে কাস্টম অ্যানালাইজার ব্যবহার করে কন্টেন্ট টোকেনাইজ এবং সার্চ অপারেশনকে আরও কার্যকর করা যায়।
Dynamic Mapping সীমিত রাখা:
- যেসব ক্ষেত্রে প্রয়োজন নেই সেগুলোতে Dynamic Mapping বন্ধ রাখা উচিত এবং স্ট্যাটিক Mapping ব্যবহার করা উচিত। এটি পারফরম্যান্স এবং নির্ভুলতা বাড়াতে সহায়ক।
ফিল্ড ইন্ডেক্সিং এবং স্টোরেজ পরিচালনা:
- শুধু প্রয়োজনীয় ফিল্ডগুলো ইন্ডেক্স করা উচিত এবং যেসব ফিল্ডে সার্চ বা ফিল্টারিং প্রয়োজন নেই সেগুলোর ইন্ডেক্সিং বন্ধ রাখা উচিত।
উপসংহার
Mapping হলো Elasticsearch-এ ডেটা ইন্ডেক্সিং এবং সার্চের জন্য একটি গুরুত্বপূর্ণ উপাদান, যা ডকুমেন্টের ফিল্ড এবং তাদের ডেটা টাইপ নির্ধারণ করে। এটি Elasticsearch-কে ডেটা সঠিকভাবে সংরক্ষণ এবং রিট্রিভ করতে সহায়ক করে। Mapping সঠিকভাবে নির্ধারণ করা হলে সার্চ অপারেশন দ্রুত এবং কার্যকরী হয় এবং বড় আকারের ডেটাবেস পরিচালনা সহজ হয়।
Dynamic এবং Static Mapping এর ব্যবহার
Elasticsearch-এ ডেটা ইন্ডেক্সিং-এর জন্য Dynamic এবং Static Mapping উভয় পদ্ধতি ব্যবহার করা যায়। প্রতিটি পদ্ধতির নিজস্ব সুবিধা এবং ব্যবহারিক ক্ষেত্রে রয়েছে। নিচে Dynamic এবং Static Mapping-এর বিস্তারিত আলোচনা এবং কখন, কীভাবে এগুলো ব্যবহার করা হয় তা নিয়ে আলোচনা করা হলো।
১. Dynamic Mapping
- Dynamic Mapping ডিফল্টভাবে Elasticsearch-এ সক্রিয় থাকে। এটি একটি স্বয়ংক্রিয় প্রক্রিয়া, যেখানে Elasticsearch নতুন ডকুমেন্ট পাওয়ার পর নতুন ফিল্ড সনাক্ত করে এবং সেগুলোর ডেটা টাইপ স্বয়ংক্রিয়ভাবে নির্ধারণ করে।
- Dynamic Mapping নতুন ডকুমেন্ট দ্রুত ইন্ডেক্স করার জন্য উপযোগী এবং যেসব ক্ষেত্রে ডেটার কাঠামো পরিবর্তন হতে পারে বা পূর্ব নির্ধারিত না থাকে, সেখানে এটি বেশ কার্যকর।
Dynamic Mapping-এর উদাহরণ
- যদি Elasticsearch-এ একটি নতুন ডকুমেন্ট পাঠানো হয় এবং এর ফিল্ডগুলো পূর্বে ইন্ডেক্সে নির্ধারণ করা না থাকে, তখন Dynamic Mapping স্বয়ংক্রিয়ভাবে ফিল্ডগুলো ইন্ডেক্স করবে:
POST /my-dynamic-index/_doc
{
"name": "John Doe",
"age": 30,
"occupation": "Engineer",
"join_date": "2022-10-01"
}- এখানে Elasticsearch নতুন
"name","age","occupation", এবং"join_date"ফিল্ড সনাক্ত করে এবং সেগুলোর ডেটা টাইপ স্বয়ংক্রিয়ভাবে নির্ধারণ করে:"name"->text"age"->integer"occupation"->text"join_date"->date
- Dynamic Mapping ফিল্ড এবং ডেটা টাইপ স্বয়ংক্রিয়ভাবে নির্ধারণ করে এবং ডেটা দ্রুত ইন্ডেক্স করা যায়।
Dynamic Mapping কখন ব্যবহার করবেন
- যখন ডেটার কাঠামো অগ্রিম নির্ধারণ করা সম্ভব নয় বা ডকুমেন্টের ফিল্ড এবং ডেটা টাইপ পরিবর্তন হতে পারে।
- যখন দ্রুত নতুন ডকুমেন্ট ইন্ডেক্স করা প্রয়োজন এবং প্রতিটি ফিল্ড ম্যানুয়ালি নির্ধারণ করার প্রয়োজন নেই।
- API বা লজিক্যাল সিস্টেমের মাধ্যমে অপ্রত্যাশিত ফিল্ড বা ডেটা টাইপ তৈরি হতে পারে, সেক্ষেত্রে Dynamic Mapping কার্যকর।
Dynamic Mapping-এর সুবিধা এবং সীমাবদ্ধতা
- সুবিধা:
- নতুন ডকুমেন্ট দ্রুত এবং স্বয়ংক্রিয়ভাবে ইন্ডেক্স করা যায়।
- ম্যানুয়ালি ফিল্ড এবং ডেটা টাইপ নির্ধারণ করতে হয় না।
- সীমাবদ্ধতা:
- Dynamic Mapping সবসময় সঠিক ডেটা টাইপ নির্ধারণ করতে পারে না, যেমন সংখ্যা
floatবাintegerহিসেবে সনাক্ত করা। - স্কিমা অনুমান করতে গিয়ে সার্চ পারফরম্যান্স কমতে পারে।
- Dynamic Mapping সবসময় সঠিক ডেটা টাইপ নির্ধারণ করতে পারে না, যেমন সংখ্যা
২. Static Mapping
- Static Mapping একটি পদ্ধতি যেখানে ব্যবহারকারী বা ডেভেলপার ইন্ডেক্স তৈরির সময় ডকুমেন্টের প্রতিটি ফিল্ড এবং তার ডেটা টাইপ আগে থেকেই নির্ধারণ করে।
- Static Mapping ব্যবহার করলে ডকুমেন্টের ফিল্ড এবং ডেটা টাইপ সবসময় সঠিক এবং নির্দিষ্ট থাকে, যা সার্চ অপারেশনের পারফরম্যান্স বাড়ায়।
Static Mapping-এর উদাহরণ
- একটি ইন্ডেক্স তৈরি করার সময় ফিল্ডের ডেটা টাইপ নির্ধারণ করতে পারেন:
PUT /my-static-index
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"occupation": { "type": "keyword" },
"join_date": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}- এখানে:
"name"ফিল্ডtextটাইপ হিসেবে নির্ধারণ করা হয়েছে।"age"ফিল্ডintegerহিসেবে,"occupation"ফিল্ডkeywordহিসেবে এবং"join_date"ফিল্ডdateটাইপ নির্ধারণ করা হয়েছে।
- ডকুমেন্ট ইন্ডেক্স করার সময় Elasticsearch এই নির্ধারিত ফিল্ড টাইপ অনুসারে কাজ করবে এবং সঠিকভাবে ডেটা ইন্ডেক্স করবে।
Static Mapping কখন ব্যবহার করবেন
- যখন ডেটার কাঠামো আগে থেকেই নির্ধারণ করা আছে এবং তা পরিবর্তন হওয়ার সম্ভাবনা নেই।
- যখন ডকুমেন্টের ফিল্ড এবং ডেটা টাইপ নিশ্চিত করা প্রয়োজন এবং সঠিক ডেটা টাইপ নির্ধারণ করে সার্চ অপারেশন অপ্টিমাইজ করা প্রয়োজন।
- যেসব ক্ষেত্রে পারফরম্যান্স এবং নির্ভুলতা গুরুত্বপূর্ণ, সেখানে Static Mapping ব্যবহার করা উচিত।
Static Mapping-এর সুবিধা এবং সীমাবদ্ধতা
- সুবিধা:
- সার্চ এবং ইন্ডেক্সিং পারফরম্যান্স উন্নত হয়, কারণ ডেটা টাইপ নির্ধারণ করা থাকে।
- ফিল্ড এবং ডেটার নির্ভুলতা নিশ্চিত করা যায়, যা সার্চ অপারেশন সঠিকভাবে পরিচালনা করতে সহায়ক।
- সীমাবদ্ধতা:
- Dynamic Mapping-এর তুলনায় Static Mapping কিছুটা সময়সাপেক্ষ, কারণ প্রতিটি ফিল্ড ম্যানুয়ালি নির্ধারণ করতে হয়।
- নতুন ফিল্ড যোগ করার জন্য Mapping আপডেট করতে হয়, যা Dynamic Mapping-এর মতো স্বয়ংক্রিয়ভাবে সম্পন্ন হয় না।
Dynamic এবং Static Mapping এর সংমিশ্রণ
- আপনি Dynamic এবং Static Mapping একত্রে ব্যবহার করতে পারেন। যেমন, কিছু ফিল্ড Static Mapping-এ নির্ধারণ করা থাকবে এবং বাকি ফিল্ড Dynamic Mapping-এ যোগ করা হবে।
- Dynamic Mapping নির্দিষ্ট ক্ষেত্রেই সীমাবদ্ধ রাখতে পারেন, যেখানে Static Mapping-এর বাইরে নতুন ডেটা যোগ করার প্রয়োজন হতে পারে।
Dynamic এবং Static Mapping এর সংমিশ্রণ উদাহরণ
PUT /mixed-index
{
"mappings": {
"dynamic": "true",
"properties": {
"product_id": { "type": "keyword" },
"price": { "type": "float" }
}
}
}
- এখানে
"product_id"এবং"price"ফিল্ড Static Mapping-এ নির্ধারিত, কিন্তু অন্য নতুন ফিল্ড Dynamic Mapping ব্যবহার করে ইন্ডেক্স করা হবে।
উপসংহার
- Dynamic Mapping সাধারণত দ্রুত নতুন ডকুমেন্ট ইন্ডেক্স করার জন্য এবং যেখানে ডেটার কাঠামো পূর্ব নির্ধারিত নয়, সেখানে ব্যবহৃত হয়।
- Static Mapping নির্ধারিত এবং নির্ভুল ডেটার ক্ষেত্রে ব্যবহৃত হয়, যেখানে ফিল্ড এবং ডেটা টাইপ নিশ্চিত করা যায় এবং সার্চ পারফরম্যান্স উন্নত করা যায়।
- Dynamic এবং Static Mapping একত্রে ব্যবহার করে ডেটার ফ্লেক্সিবিলিটি এবং নির্ভুলতা নিশ্চিত করা যায়, যা ডেটা ইন্ডেক্সিং এবং সার্চ অপারেশনের জন্য কার্যকরী হয়।
Elasticsearch-এ Field Data Type এবং তাদের প্রয়োগ
Elasticsearch-এ Field Data Type হলো একটি গুরুত্বপূর্ণ উপাদান, যা নির্ধারণ করে প্রতিটি ফিল্ড কী ধরনের ডেটা ধারণ করবে। এটি Elasticsearch-কে ডেটা সঠিকভাবে ইন্ডেক্স করতে এবং সার্চ অপারেশন কার্যকরী করতে সহায়ক করে। Elasticsearch বিভিন্ন ধরনের ডেটা টাইপ সমর্থন করে, যেমন text, keyword, integer, date, এবং আরও অনেক। প্রতিটি ডেটা টাইপের নির্দিষ্ট ব্যবহার এবং প্রয়োগ রয়েছে, যা নিচে আলোচনা করা হলো।
১. Text Data Type
- Text ডেটা টাইপ মূলত ফ্রি-টেক্সট বা বড় টেক্সট কনটেন্ট সংরক্ষণের জন্য ব্যবহৃত হয়। এটি সাধারণত টোকেনাইজ এবং এনালাইসিস করা হয়, যাতে ফ্রি-টেক্সট সার্চ করা যায়।
- Text ডেটা টাইপ সাধারণত এমন ফিল্ডে ব্যবহার করা হয়, যেখানে বড় আকারের টেক্সট বা বিবরণ সংরক্ষিত থাকে, যেমন ডকুমেন্টের শিরোনাম, বিবরণ, বা কনটেন্ট।
উদাহরণ:
{
"properties": {
"description": {
"type": "text",
"analyzer": "standard"
}
}
}
- এখানে
"description"ফিল্ডেtextটাইপ ব্যবহার করা হয়েছে, যা ফ্রি-টেক্সট ডেটা সংরক্ষণ করবে এবং"standard"অ্যানালাইজার ব্যবহার করে টোকেনাইজ করা হবে।
২. Keyword Data Type
- Keyword ডেটা টাইপ সুনির্দিষ্ট কিওয়ার্ড বা টার্ম সংরক্ষণের জন্য ব্যবহৃত হয়, যা ইন্ডেক্স এবং এক্সাক্ট ম্যাচ সার্চের জন্য উপযোগী।
- Keyword সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয়, যেখানে ফিল্ডে ছোট এবং নির্দিষ্ট মান সংরক্ষণ করা হয়, যেমন স্ট্যাটাস, ক্যাটেগরি, আইডি, বা কোড।
উদাহরণ:
{
"properties": {
"status": {
"type": "keyword"
}
}
}
- এখানে
"status"ফিল্ডেkeywordটাইপ ব্যবহার করা হয়েছে, যা এক্সাক্ট ম্যাচ সার্চের জন্য সঠিক।
৩. Numeric Data Types (সংখ্যামূলক ডেটা টাইপ)
Elasticsearch-এ কয়েকটি Numeric ডেটা টাইপ রয়েছে:
- integer: সম্পূর্ণ সংখ্যা সংরক্ষণের জন্য।
- long: বড় আকারের সংখ্যা (৬৪-বিট) সংরক্ষণের জন্য।
- float: দশমিক সংখ্যা সংরক্ষণের জন্য (৩২-বিট)।
- double: উচ্চ-নির্ভুলতার দশমিক সংখ্যা (৬৪-বিট) সংরক্ষণের জন্য।
Numeric ডেটা টাইপ সাধারণত সংখ্যা, বয়স, স্কোর, প্রাইস, বা অন্যান্য গাণিতিক মান সংরক্ষণের জন্য ব্যবহৃত হয়।
উদাহরণ:
{
"properties": {
"price": {
"type": "float"
},
"quantity": {
"type": "integer"
}
}
}
- এখানে
"price"ফিল্ডেfloatএবং"quantity"ফিল্ডেintegerটাইপ ব্যবহার করা হয়েছে।
৪. Date Data Type
- Date ডেটা টাইপ তারিখ এবং সময় সংরক্ষণের জন্য ব্যবহৃত হয়। Elasticsearch-এ তারিখ বিভিন্ন ফরম্যাটে সংরক্ষণ করা যায় এবং ডিফল্টভাবে এটি ISO 8601 ফরম্যাট সমর্থন করে।
- Date টাইপ সাধারণত তারিখ, সময়, বা লগ এন্ট্রির সময়সংক্রান্ত ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়।
উদাহরণ:
{
"properties": {
"join_date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
- এখানে
"join_date"ফিল্ডেdateটাইপ ব্যবহার করা হয়েছে এবং"yyyy-MM-dd"ফরম্যাট নির্ধারণ করা হয়েছে।
৫. Boolean Data Type
- Boolean ডেটা টাইপ
trueবাfalseমান সংরক্ষণের জন্য ব্যবহৃত হয়। - এটি সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে হ্যাঁ বা না, সক্রিয় বা নিষ্ক্রিয় অবস্থা চিহ্নিত করতে হয়।
উদাহরণ:
{
"properties": {
"is_active": {
"type": "boolean"
}
}
}
- এখানে
"is_active"ফিল্ডেbooleanটাইপ ব্যবহার করা হয়েছে, যা সক্রিয় বা নিষ্ক্রিয় অবস্থা সংরক্ষণ করবে।
৬. Geo-Point Data Type
- geo_point ডেটা টাইপ ভৌগোলিক স্থান সংরক্ষণের জন্য ব্যবহৃত হয়, যা ল্যাটিটিউড এবং লংগিটিউড মান ধারণ করে।
- এটি সাধারণত অবস্থান সম্পর্কিত ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়, যেমন লোকেশন, ঠিকানা, বা স্থানীয় দোকানের অবস্থান।
উদাহরণ:
{
"properties": {
"location": {
"type": "geo_point"
}
}
}
- এখানে
"location"ফিল্ডেgeo_pointটাইপ ব্যবহার করা হয়েছে, যা একটি ভৌগোলিক পয়েন্ট ধারণ করবে।
৭. Object এবং Nested Data Type
- Object ডেটা টাইপ একটি ডকুমেন্টের মধ্যে অন্য ডকুমেন্ট সংরক্ষণের জন্য ব্যবহৃত হয়। এটি সাধারণত অবজেক্ট বা জটিল ডেটা স্ট্রাকচার সংরক্ষণের জন্য উপযুক্ত।
- Nested টাইপ একটি বিশেষ ধরনের Object, যা অবজেক্টের ভেতরের ডেটাকে আলাদাভাবে ইন্ডেক্স করে, যাতে জটিল কোয়েরি চালানো যায়।
Object উদাহরণ:
{
"properties": {
"address": {
"type": "object",
"properties": {
"street": { "type": "text" },
"city": { "type": "keyword" },
"zipcode": { "type": "integer" }
}
}
}
}
- এখানে
"address"ফিল্ড একটিobjectটাইপ, যেখানেstreet,city, এবংzipcodeসংরক্ষিত হয়েছে।
Nested উদাহরণ:
{
"properties": {
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"message": { "type": "text" },
"created_at": { "type": "date" }
}
}
}
}
- এখানে
"comments"ফিল্ডnestedটাইপ ব্যবহার করা হয়েছে, যা প্রতিটি মন্তব্যের জন্য আলাদা ডকুমেন্ট হিসেবে কাজ করবে।
৮. IP Data Type
- ip ডেটা টাইপ IPv4 বা IPv6 অ্যাড্রেস সংরক্ষণের জন্য ব্যবহৃত হয়। এটি সাধারণত লগ ডেটা বা নেটওয়ার্ক সম্পর্কিত ডেটা সংরক্ষণের জন্য উপযুক্ত।
উদাহরণ:
{
"properties": {
"client_ip": {
"type": "ip"
}
}
}
- এখানে
"client_ip"ফিল্ডেipটাইপ ব্যবহার করা হয়েছে, যা ক্লায়েন্টের IP ঠিকানা ধারণ করবে।
৯. Completion Data Type
- completion টাইপ Elasticsearch-এ অটো-কমপ্লিশন সার্চ করার জন্য ব্যবহৃত হয়। এটি দ্রুত সার্চ সাজেশন তৈরি করতে সহায়ক।
- এটি সাধারণত সার্চ বক্সে ইনপুটের সময় দ্রুত সাজেশন তৈরি করতে ব্যবহার করা হয়।
উদাহরণ:
{
"properties": {
"suggest": {
"type": "completion"
}
}
}
- এখানে
"suggest"ফিল্ডেcompletionটাইপ ব্যবহার করা হয়েছে, যা ইনপুট টেক্সটের জন্য দ্রুত সাজেশন প্রদান করবে।
উপসংহার
Elasticsearch-এ Field Data Type এবং তাদের প্রয়োগ সঠিকভাবে নির্ধারণ করা জরুরি, কারণ এটি ডেটা ইন্ডেক্স এবং সার্চ অপারেশনের কার্যকারিতা ও পারফরম্যান্স নির্ধারণ করে। প্রতিটি ডেটা টাইপ নির্দিষ্ট প্রয়োজনের উপর ভিত্তি করে ব্যবহার করা উচিত। সঠিক ডেটা টাইপ নির্বাচন করে এবং সেটি কনফিগার করে, Elasticsearch-কে আরও কার্যকর এবং দ্রুততর করে তোলা সম্ভব।
Schema Design এর বেস্ট প্র্যাকটিস
Elasticsearch-এ Schema Design একটি গুরুত্বপূর্ণ কাজ, যা ডেটার কাঠামো এবং সার্চ অপারেশনের পারফরম্যান্স নির্ধারণ করে। একটি ভালোভাবে পরিকল্পিত স্কিমা Elasticsearch-কে ডেটা ইন্ডেক্স এবং সার্চ অপারেশন দ্রুত ও কার্যকরভাবে পরিচালনা করতে সহায়ক করে। নিচে Schema Design-এর কিছু বেস্ট প্র্যাকটিস আলোচনা করা হলো, যা অনুসরণ করে আপনি Elasticsearch-এর পারফরম্যান্স এবং কার্যকারিতা উন্নত করতে পারবেন।
১. সঠিক ফিল্ড টাইপ নির্ধারণ করা
- প্রতিটি ফিল্ডের জন্য সঠিক ডেটা টাইপ নির্ধারণ করা অত্যন্ত গুরুত্বপূর্ণ। এটি ডেটা ইন্ডেক্সিং এবং সার্চ অপারেশন দ্রুত করতে সহায়ক করে।
- উদাহরণস্বরূপ:
- ফ্রি-টেক্সটের জন্য text টাইপ ব্যবহার করুন।
- সুনির্দিষ্ট মানের জন্য keyword টাইপ ব্যবহার করুন।
- সংখ্যামূলক ডেটার জন্য integer, float, বা double ব্যবহার করুন।
- তারিখ এবং সময়ের জন্য date টাইপ ব্যবহার করুন।
ভুল:
"price": { "type": "text" }
সঠিক:
"price": { "type": "float" }
- ফিল্ডের সঠিক টাইপ নির্ধারণ করলে Elasticsearch ইন্ডেক্স এবং সার্চ অপারেশন দ্রুত করতে পারে।
২. Text এবং Keyword ফিল্ডের পার্থক্য বোঝা এবং সঠিকভাবে প্রয়োগ করা
- Text এবং Keyword টাইপের মধ্যে পার্থক্য বোঝা গুরুত্বপূর্ণ।
- Text টাইপ ফ্রি-টেক্সট ডেটা টোকেনাইজ করে এবং সার্চের জন্য এনালাইসিস করে।
- Keyword টাইপ সুনির্দিষ্ট মানের জন্য ব্যবহার করা হয়, যা সাধারণত এক্সাক্ট ম্যাচ সার্চের জন্য উপযুক্ত।
- যদি সার্চ অপারেশন ফ্রি-টেক্সট এনালাইসিসের উপর ভিত্তি করে না হয়, তবে keyword টাইপ ব্যবহার করা উচিত, যা সার্চ পারফরম্যান্স উন্নত করতে সহায়ক।
উদাহরণ:
{
"properties": {
"title": { "type": "text" },
"category": { "type": "keyword" }
}
}
- এখানে
"title"ফিল্ডেtextএবং"category"ফিল্ডেkeywordটাইপ ব্যবহার করা হয়েছে।
৩. ইন্ডেক্সিং সীমিত করা
- সব ফিল্ড ইন্ডেক্স করা প্রয়োজন নেই। শুধুমাত্র যে ফিল্ডগুলো সার্চ অপারেশনের জন্য প্রয়োজন, সেগুলো ইন্ডেক্স করা উচিত।
- index: false ব্যবহার করে প্রয়োজনীয় নয় এমন ফিল্ডগুলো ইন্ডেক্সিং থেকে বাদ দিন, যা ইন্ডেক্স সাইজ কমায় এবং পারফরম্যান্স বাড়ায়।
উদাহরণ:
{
"properties": {
"description": { "type": "text", "index": false },
"name": { "type": "keyword" }
}
}
- এখানে
"description"ফিল্ড ইন্ডেক্স করা হয়নি, কারণ এটি সার্চ অপারেশনের জন্য প্রয়োজন নেই।
৪. Dynamic Mapping সীমিত রাখা
- Dynamic Mapping Elasticsearch-এ ডিফল্টভাবে সক্রিয় থাকে, যা নতুন ফিল্ড সনাক্ত করে ডেটা টাইপ নির্ধারণ করে।
- Dynamic Mapping সবসময় সঠিক ডেটা টাইপ নির্ধারণ করতে পারে না এবং এটি সার্চ পারফরম্যান্সের উপর নেতিবাচক প্রভাব ফেলতে পারে।
- যখন সম্ভব, Static Mapping ব্যবহার করা উচিত, যাতে প্রতিটি ফিল্ড এবং তার ডেটা টাইপ আগে থেকেই নির্ধারণ করা থাকে।
উদাহরণ:
PUT /fixed-index
{
"mappings": {
"dynamic": "strict",
"properties": {
"username": { "type": "keyword" },
"created_at": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}
- এখানে
"dynamic": "strict"ব্যবহার করে Dynamic Mapping বন্ধ রাখা হয়েছে।
৫. Nested এবং Object টাইপ ব্যবহারে সতর্ক থাকা
- Nested এবং Object টাইপ জটিল ডেটা স্ট্রাকচার সংরক্ষণের জন্য ব্যবহৃত হয়, তবে এগুলো ব্যবহার করলে সার্চ এবং ইন্ডেক্সিং পারফরম্যান্সে প্রভাব পড়তে পারে।
- শুধুমাত্র যেখানে Nested ডেটার জন্য আলাদা ডকুমেন্ট সংরক্ষণ এবং সার্চের প্রয়োজন আছে, সেখানে nested টাইপ ব্যবহার করা উচিত।
উদাহরণ:
{
"properties": {
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"message": { "type": "text" }
}
}
}
}
- এখানে
"comments"ফিল্ডেnestedটাইপ ব্যবহার করা হয়েছে, যা জটিল কোয়েরির জন্য উপযোগী।
৬. Date ফিল্ডের ফরম্যাট নির্ধারণ করা
- Date ফিল্ডে সঠিক ফরম্যাট নির্ধারণ করা অত্যন্ত গুরুত্বপূর্ণ, যাতে Elasticsearch ডেটা সঠিকভাবে ইন্ডেক্স এবং রিট্রিভ করতে পারে।
- ডিফল্ট ফরম্যাট ছাড়াও, কাস্টম ফরম্যাট ব্যবহার করে তারিখ সংরক্ষণ করা উচিত।
উদাহরণ:
{
"properties": {
"event_date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }
}
}
- এখানে
"event_date"ফিল্ডে কাস্টম ফরম্যাট নির্ধারণ করা হয়েছে।
৭. Geo-Point এবং Geo-Shape ফিল্ডের সঠিক ব্যবহার
- ভৌগোলিক ডেটা সংরক্ষণের জন্য geo_point বা geo_shape টাইপ ব্যবহার করা উচিত। এটি জিওস্পেশিয়াল কোয়েরি চালাতে এবং অবস্থানভিত্তিক ডেটা বিশ্লেষণ করতে সহায়ক।
- যেসব ক্ষেত্রে অবস্থানের ভিত্তিতে সার্চ প্রয়োজন সেখানে geo_point ব্যবহার করা উচিত এবং বড় আকারের ভৌগোলিক আকারের জন্য geo_shape।
উদাহরণ:
{
"properties": {
"location": { "type": "geo_point" }
}
}
- এখানে
"location"ফিল্ডেgeo_pointটাইপ ব্যবহার করা হয়েছে।
৮. Field Name এবং Type Naming Conventions অনুসরণ করা
- ফিল্ড নাম এবং ডেটা টাইপ নির্ধারণ করার সময় কনভেনশন মেনে চলা উচিত। এটি ইন্ডেক্স এবং সার্চ অপারেশন ম্যানেজ করতে সহজ করে এবং স্কিমার সাথে সামঞ্জস্য বজায় রাখে।
- ফিল্ড নাম সংক্ষিপ্ত এবং বর্ণনামূলক হওয়া উচিত, যাতে এটি বোঝা যায়।
৯. Completion এবং Suggestion ফিল্ড সঠিকভাবে ব্যবহার করা
- যদি অটো-কমপ্লিশন বা সাজেশন সার্চ প্রয়োজন হয়, তবে completion টাইপ ব্যবহার করা উচিত। এটি সার্চ টাইম কমাতে সাহায্য করে।
- শুধুমাত্র যেখানে দ্রুত সাজেশন প্রয়োজন সেখানে এটি ব্যবহার করুন, কারণ এটি মেমোরি ব্যবহার বাড়াতে পারে।
উদাহরণ:
{
"properties": {
"suggest": { "type": "completion" }
}
}
- এখানে
"suggest"ফিল্ডেcompletionটাইপ ব্যবহার করা হয়েছে, যা অটো-কমপ্লিশন সার্চের জন্য উপযোগী।
১০. ইন্ডেক্স সাইজ এবং শার্ড সংখ্যা নির্ধারণ করা
- Schema Design করার সময় শার্ড এবং রেপ্লিকা সংখ্যা নির্ধারণ করা উচিত। ডেটার পরিমাণ এবং স্কেল অনুযায়ী শার্ড সংখ্যা নির্ধারণ করলে ইন্ডেক্স পারফরম্যান্স উন্নত হয়।
- ইন্ডেক্স তৈরির সময় সঠিকভাবে শার্ড এবং রেপ্লিকা সংখ্যা নির্ধারণ করতে ভুলবেন না।
উদাহরণ:
PUT /optimized-index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
- এখানে ৩টি শার্ড এবং ১টি রেপ্লিকা নির্ধারণ করা হয়েছে।
উপসংহার
Elasticsearch-এ Schema Design করার সময় কিছু বেস্ট প্র্যাকটিস অনুসরণ করলে ইন্ডেক্সিং এবং সার্চ অপারেশনের পারফরম্যান্স ও কার্যকারিতা উন্নত হয়। সঠিক ফিল্ড টাইপ নির্ধারণ, প্রয়োজনীয় ফিল্ডগুলো ইন্ডেক্স করা, এবং Dynamic Mapping নিয়ন্ত্রণ করার মতো চর্চাগুলো Elasticsearch-কে আরও কার্যকর করে তোলে। Schema Design
Read more